本篇文章同步發布於 Python 使用 openpyxl 設定 Excel 儲存格格式【Python 處理 Excel #20】
學會將 Python pandas 的 DataFrame 輸出到 Excel 檔案以後,有好一段時間我都會在輸出檔案以後打開檔案用滑鼠一一後把日期相關的欄位格式改為 Excel 的簡短日期,或是把 ID 相關的欄位格式通通設定為文字。
Excel 的巨集可以縮短調整格式的時間,不過某天學會直接用 openpyxl 在輸出 Excel 檔案前針對特定的欄位們設定格式,打開輸出的 Excel 檔案看見漂漂亮亮、不需要再調整的內容,心情無比美麗。這篇文章分享在 Python 中如何使用 openpyxl 設定 Excel 的儲存格格式。
用 openpyxl 設定活頁簿的儲存格格式以前,需要先建立儲存格格式本身。所謂「儲存格格式本身」對應到 Excel 檔案的正式名稱是「數字格式代碼」,例如「@」符號在 Excel 代表的是文字格式、「yyyy」代表的是年度的格式等。數字格式代碼也可以用來控制儲存格值的顏色、小數點位數、空格等條件。
openpyxl 透過其下的 NamedStyle
類別建立和管理 Excel 工作表中的儲存格格式,並且賦予一個唯一的名稱,方便在活頁簿中重複使用。NamedStyle
除了用於定義儲存格的數字格式代碼,也可以定義對齊方式、字體、邊框等各種 Excel 常見的格式化選項。
下方是建立或取得特定名稱的格式的程式碼:
from openpyxl.styles import NamedStyle
def create_excel_style(wb, style_name, number_format):
"""
在指定的活頁簿中建立或取得指定名稱的格式。
參數:
wb (Workbook): 要操作的活頁簿物件。
style_name (str): 格式的名稱。
number_format (str): 格式的數字格式。
返回:
NamedStyle: 新建立或既有的格式。
"""
# 檢查格式是否已經存在
if style_name in wb.named_styles:
return wb.named_styles[style_name]
# 建立新的樣式
new_style = NamedStyle(name=style_name, number_format=number_format)
wb.add_named_style(new_style)
return new_style
wb.named_styles
:此屬性包含了活頁簿中所有已命名的格式。透過檢查是否已有同名稱的式,可以避免重複建立相同名稱的格式。NamedStyle
:這個類別允許使用者自訂儲存格的格式。這裡只指定了數字格式 (number_format
),但也可以在建立格式時設置更多屬性,如字體、對齊方式等。wb.add_named_style(new_style)
:將新的格式加入到活頁簿中,以便後續套用到儲存格上。下方程式碼介紹如何將不同的格式套用到工作表中的儲存格:
def apply_excel_styles(wb, ws):
"""
根據欄位名稱套用不同格式到工作表中的儲存格。
參數:
wb (Workbook): openpyxl 的 Workbook 物件。
ws (Worksheet): openpyxl 的 Worksheet 物件。
"""
# 建立不同類型的格式
string_style = create_excel_style(wb, 'string_style', '@')
date_style = create_excel_style(wb, 'date_style', 'YYYY/MM/DD')
number_style = create_excel_style(wb, 'number_style', '#,##0;-#,##0')
# 根據欄位名稱套用儲存格樣式
for col in range(1, ws.max_column + 1):
header = ws.cell(row=1, column=col).value
for row in range(2, ws.max_row + 1):
cell = ws.cell(row=row, column=col)
if '日期' in header or '交期' in header:
cell.style = date_style
elif '數量' in header or '金額' in header:
cell.style = number_style
else:
cell.style = string_style
create_excel_style
函數,為字串、日期、數字等資料型別建立了對應的儲存格格式。header
),將對應的格式套用到儲存格。這樣能夠確保不同類型的資料有正確的格式,例如以千分位符號分隔數字或金額的儲存格值。最後透過一個測試用的案例介紹如何從頭開始建立 Excel 檔案,並為儲存格套用相對應的格式:
from openpyxl import Workbook
def create_sample_excel():
"""
建立一個 demo 的 Excel 檔案並套用儲存格格式。
"""
# 建立活頁簿與工作表
wb = Workbook()
ws = wb.active
ws.title = "demo"
# 增加欄位名稱與資料
headers = ['訂單編號', '數量', '單價', '總金額', '出貨日期']
data = [
['0001', 100, 10.5, 1050, '2024/09/13'],
['0002', 200, 15.0, 3000, '2024/10/01'],
['0003', 50, 20.0, 1000, '2024/11/20']
]
ws.append(headers)
for row in data:
ws.append(row)
# 套用樣式
apply_excel_styles(wb, ws)
# 儲存 Excel 檔案
wb.save('styled_example.xlsx')
# 執行案例
if __name__ == "__main__":
create_sample_excel()
styled_example.xlsx
的檔案。NamedStyle
類別可以建立能重複使用的儲存格格式,進而根據欄位名稱或數據類型自動應用不同的儲存格格式。本篇文章同步發布於 Python 使用 openpyxl 設定 Excel 儲存格格式【Python 處理 Excel #20】